home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.asm.Assembler;
- import sun.tools.java.AmbiguousField;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
- import sun.tools.java.Type;
-
- public class MethodExpression extends NaryExpression {
- // $FF: renamed from: id sun.tools.java.Identifier
- Identifier field_0;
- ClassDefinition clazz;
- FieldDefinition field;
- final int MAXINLINECOST = 30;
-
- public MethodExpression(int var1, Expression var2, Identifier var3, Expression[] var4) {
- super(47, var1, Type.tError, var2, var4);
- this.field_0 = var3;
- }
-
- public MethodExpression(int var1, Expression var2, FieldDefinition var3, Expression[] var4) {
- super(47, var1, var3.getType().getReturnType(), var2, var4);
- this.field_0 = var3.getName();
- this.field = var3;
- this.clazz = var3.getClassDefinition();
- }
-
- public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
- Object var6 = null;
- boolean var7 = false;
- Type[] var8 = new Type[super.args.length];
-
- try {
- ClassDeclaration var15;
- if (super.right == null) {
- var7 = var2.field.isStatic();
- var15 = var2.field.getClassDeclaration();
- } else {
- if (this.field_0.equals(Constants.idInit)) {
- if (!var2.field.isConstructor()) {
- var1.error(super.where, "invalid.constr.invoke");
- return var3 | 1L;
- }
-
- if ((var3 & 1L) != 0L) {
- var1.error(super.where, "constr.invoke.not.first");
- return var3;
- }
-
- super.right.checkValue(var1, var2, var3 | 1L, var5);
- } else {
- IdentifierExpression[] var9 = new IdentifierExpression[1];
- Expression var10 = FieldExpression.mungeFieldRight(super.right, var1, var2, var9);
- if (var10 == null) {
- var1.error(var9[0].where, "undef.var", var9[0].id);
- return var3;
- }
-
- super.right = var10;
- if (var10 instanceof TypeExpression) {
- var7 = true;
- } else {
- var3 = super.right.checkValue(var1, var2, var3, var5);
- }
- }
-
- if (super.right.type.isType(10)) {
- var15 = var1.getClassDeclaration(super.right.type);
- } else {
- if (!super.right.type.isType(9)) {
- if (!super.right.type.isType(13)) {
- var1.error(super.where, "invalid.method.invoke", super.right.type);
- }
-
- return var3;
- }
-
- var15 = var1.getClassDeclaration(Type.tObject);
- }
- }
-
- boolean var17 = false;
-
- for(int var19 = 0; var19 < super.args.length; ++var19) {
- var3 = super.args[var19].checkValue(var1, var2, var3, var5);
- var8[var19] = super.args[var19].type;
- var17 = var17 || var8[var19].isType(13);
- }
-
- if (this.field_0.equals(Constants.idInit)) {
- var3 |= 1L;
- }
-
- if (var17) {
- return var3;
- }
-
- this.clazz = var15.getClassDefinition(var1);
- ClassDefinition var11 = var2.field.getClassDefinition();
- this.field = this.clazz.matchMethod(var1, var11, this.field_0, var8);
- if (this.field == null) {
- if (this.field_0.equals(Constants.idInit)) {
- String var23 = this.clazz.getName().getName().toString();
- var23 = Type.tMethod(Type.tError, var8).typeString(var23, false, false);
- var1.error(super.where, "unmatched.constr", var23, var15);
- return var3;
- }
-
- String var12 = this.field_0.toString();
- var12 = Type.tMethod(Type.tError, var8).typeString(var12, false, false);
- if (this.clazz.findAnyMethod(var1, this.field_0) == null) {
- var1.error(super.where, "undef.meth", var12, var15);
- } else {
- var1.error(super.where, "unmatched.meth", var12, var15);
- }
-
- return var3;
- }
-
- if (var7 && !this.field.isStatic()) {
- var1.error(super.where, "no.static.meth.access", this.field, this.field.getClassDeclaration());
- return var3;
- }
-
- if (this.field.isProtected() && super.right != null && !(super.right instanceof SuperExpression) && !var11.protectedAccess(var1, this.field, super.right.type)) {
- var1.error(super.where, "invalid.protected.method.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
- return var3;
- }
-
- if (this.field.isAbstract() && super.right != null && super.right.op == 83) {
- var1.error(super.where, "invoke.abstract", this.field, this.field.getClassDeclaration());
- return var3;
- }
-
- if (this.field.isConstructor() && var2.field.equals(this.field)) {
- var1.error(super.where, "recursive.constr", this.field);
- }
-
- var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
- } catch (ClassNotFound var13) {
- var1.error(super.where, "class.not.found", var13.name, var2.field);
- return var3;
- } catch (AmbiguousField var14) {
- var1.error(super.where, "ambig.field", this.field_0, var14.field1, var14.field2);
- return var3;
- }
-
- if (super.right == null && !this.field.isStatic()) {
- super.right = new ThisExpression(super.where, var2);
- if ((var3 & 1L) == 0L) {
- var1.error(super.where, "access.inst.before.super", Constants.idThis);
- }
- }
-
- var8 = this.field.getType().getArgumentTypes();
-
- for(int var18 = 0; var18 < super.args.length; ++var18) {
- super.args[var18] = ((Node)this).convert(var1, var2, var8[var18], super.args[var18]);
- }
-
- ClassDeclaration[] var20 = this.field.getExceptions(var1);
-
- for(int var21 = 0; var21 < var20.length; ++var21) {
- if (var5.get(var20[var21]) == null) {
- var5.put(var20[var21], this);
- }
- }
-
- super.type = this.field.getType().getReturnType();
- return var3;
- }
-
- public long check(Environment var1, Context var2, long var3, Hashtable var5) {
- return this.checkValue(var1, var2, var3, var5);
- }
-
- Expression inlineMethod(Environment var1, Context var2, Statement var3, boolean var4) {
- if (var1.dump()) {
- System.out.println("INLINE METHOD " + this.field + " in " + var2.field);
- }
-
- Vector var5 = this.field.getArguments();
- Statement[] var6 = new Statement[var5.size() + 2];
- int var7 = 0;
- if (this.field.isStatic()) {
- var6[0] = new ExpressionStatement(super.where, super.right);
- } else {
- if (super.right != null && super.right.op == 83) {
- super.right = new ThisExpression(super.right.where, var2);
- }
-
- var6[0] = new VarDeclarationStatement(super.where, (LocalField)var5.elementAt(var7++), super.right);
- }
-
- for(int var8 = 0; var8 < super.args.length; ++var8) {
- var6[var8 + 1] = new VarDeclarationStatement(super.where, (LocalField)var5.elementAt(var7++), super.args[var8]);
- }
-
- var6[var6.length - 1] = var3 != null ? var3.copyInline(var2, var4) : null;
- InlineMethodExpression var9 = new InlineMethodExpression(super.where, super.type, this.field, new CompoundStatement(super.where, var6));
- return var4 ? ((Expression)var9).inlineValue(var1, var2) : ((Expression)var9).inline(var1, var2);
- }
-
- public Expression inline(Environment var1, Context var2) {
- try {
- if (super.right != null) {
- super.right = this.field.isStatic() ? super.right.inline(var1, var2) : super.right.inlineValue(var1, var2);
- }
-
- for(int var3 = 0; var3 < super.args.length; ++var3) {
- super.args[var3] = super.args[var3].inlineValue(var1, var2);
- }
-
- Object var4 = this;
- if (var1.optimize() && this.field.isInlineable(var1, this.clazz.isFinal()) && (this.field_0 == null || !this.field_0.equals(Constants.idInit)) && !var2.field.isInitializer() && var2.field.isMethod() && var2.getInlineFieldContext(this.field) == null) {
- Statement var5 = (Statement)this.field.getValue(var1);
- if (var5 == null || var5.costInline(30) < 30) {
- var4 = this.inlineMethod(var1, var2, var5, false);
- }
- }
-
- if (var2.field.isConstructor() && this.field.isConstructor() && super.right != null && super.right.op == 83 && this.field_0 != null) {
- this.field_0 = null;
-
- for(FieldDefinition var9 = var2.field.getClassDefinition().getFirstField(); var9 != null; var9 = var9.getNextField()) {
- if (var9.isVariable() && !var9.isStatic()) {
- Expression var6 = (Expression)var9.getValue(var1);
- if (var6 != null && !var6.equals(0)) {
- FieldExpression var7 = new FieldExpression(var9.getWhere(), new ThisExpression(var9.getWhere(), var2), var9.getName());
- var7.field = var9;
- var6 = new AssignExpression(var9.getWhere(), var7, var6.copyInline(var2));
- var6 = var6.inline(var1, var2);
- if (var6 != null) {
- var4 = new CommaExpression(var9.getWhere(), (Expression)var4, var6);
- }
- }
- }
- }
- }
-
- return (Expression)var4;
- } catch (ClassNotFound var8) {
- throw new CompilerError(var8);
- }
- }
-
- public Expression inlineValue(Environment var1, Context var2) {
- try {
- if (super.right != null) {
- super.right = this.field.isStatic() ? super.right.inline(var1, var2) : super.right.inlineValue(var1, var2);
- }
-
- for(int var3 = 0; var3 < super.args.length; ++var3) {
- super.args[var3] = super.args[var3].inlineValue(var1, var2);
- }
-
- if (var1.optimize() && this.field.isInlineable(var1, this.clazz.isFinal()) && !var2.field.isInitializer() && var2.field.isMethod() && var2.getInlineFieldContext(this.field) == null) {
- Statement var4 = (Statement)this.field.getValue(var1);
- if (var4 == null || var4.costInline(30) < 30) {
- return this.inlineMethod(var1, var2, var4, true);
- }
- }
-
- return this;
- } catch (ClassNotFound var5) {
- throw new CompilerError(var5);
- }
- }
-
- public void codeValue(Environment var1, Context var2, Assembler var3) {
- if (this.field.isStatic()) {
- if (super.right != null) {
- super.right.code(var1, var2, var3);
- }
- } else if (super.right == null) {
- var3.add(super.where, 25, new Integer(0));
- } else {
- super.right.codeValue(var1, var2, var3);
- }
-
- for(int var4 = 0; var4 < super.args.length; ++var4) {
- super.args[var4].codeValue(var1, var2, var3);
- }
-
- if (this.field.isStatic()) {
- var3.add(super.where, 184, this.field);
- } else if (!this.field.isConstructor() && !this.field.isPrivate() && (super.right == null || super.right.op != 83)) {
- if (this.field.getClassDefinition().isInterface()) {
- var3.add(super.where, 185, this.field);
- } else {
- var3.add(super.where, 182, this.field);
- }
- } else {
- var3.add(super.where, 183, this.field);
- }
- }
-
- public boolean firstConstructor() {
- return this.field_0.equals(Constants.idInit);
- }
-
- public void print(PrintStream var1) {
- var1.print("(" + Constants.opNames[super.op]);
- if (super.right != null) {
- var1.print(" ");
- super.right.print(var1);
- }
-
- var1.print(" " + (this.field_0 == null ? Constants.idInit : this.field_0));
-
- for(int var2 = 0; var2 < super.args.length; ++var2) {
- var1.print(" ");
- if (super.args[var2] != null) {
- super.args[var2].print(var1);
- } else {
- var1.print("<null>");
- }
- }
-
- var1.print(")");
- }
- }
-